package ia;

import java.util.ArrayList;
import java.util.Iterator;

public class Anchura45 extends Anchura {

    private ArrayList<Nodo45> nAbiertos = new ArrayList<Nodo45>();
    private ArrayList<Nodo45> nCerrados = new ArrayList<Nodo45>();
    private static Anchura45  instancia = new Anchura45();

    private Anchura45(){}

    public static Anchura45 getInstance(){
        return instancia;
    }

    @Override
    public float buscar() {
        int[] posAbdel = general.getPosAbdel();
    	
        ArrayList<Nodo45> sucesores = new ArrayList<Nodo45>();
        Nodo45 nInicial = new Nodo45(posAbdel[0],posAbdel[1],Orientacion.N);
        
        int     id        = 1;
        int     iteracion = 1;
        float   coste     = 0;
        boolean salir     = false;

        
        nAbiertos.add(nInicial);

        if(meta(nInicial)) {
               nInicial.mostrarResultado(null);
        } else 
        	   if (nAbiertos.size() == 0) System.out.println("Lista de nodos abiertos vacia.");
        
        Iterator itAbiertos = nAbiertos.iterator(); // iterador de nodos abiertos
        
        while(itAbiertos.hasNext()&!salir){
        	
            System.out.println("Iteracion: "+iteracion+", nodos abiertos:\n"+nAbiertos);
            iteracion++;

            Nodo45 nodo = nAbiertos.get(0);
            nAbiertos.remove(nodo);
            nCerrados.add(nodo);
            
            sucesores = nodo.aplicaOperadores(general.getMatriz());
            
            Iterator itCerrados = sucesores.iterator();  // iterador de nodos cerrados

            while (itCerrados.hasNext()){
                Nodo45 sucesor = (Nodo45)itCerrados.next();
                
                if (!nAbiertos.contains(sucesor) & !nCerrados.contains(sucesor)) {
                    sucesor.setId(id);
                    sucesor.setPadre(nodo);
                    nAbiertos.add(sucesor);
                    id++;
                }
                
                if(meta(sucesor)) {
                      coste = sucesor.getCoste();
					  System.out.println("Iteracion: "+iteracion+"\n"+nAbiertos);
					  System.out.println("\nFIN:         Encontrada solución");
					  sucesor.mostrarResultado(nCerrados);

                      salir = true;
                      break;
                }
                sucesor = null;                
            }           
        }
        return coste;
    } 
}
